#include <func.h>
#define INIT_NUMBER 3       // 客户端最开始注册的人数
#define SALT_LENGTH 10      // 盐值的长度

char* genRandomString(int length)       // 得到随机盐值
{
    int flag, i;
    char* string;
    if ((string = (char*) malloc(length)) == NULL )
    {
        printf("Malloc failed!flag:14\n");
        return NULL ;
    }
    for (i = 0; i < length+1; i++)
    {
        flag = rand() % 3;
        switch (flag)
        {
        case 0:
            string[i] = 'A' + rand() % 26;
            break;
        case 1:
            string[i] = 'a' + rand() % 26;
        	break;
        case 2:
            string[i] = '0' + rand() % 10;
            break;
        default:
            string[i] = 'x';
            break;
        }
    }
    string[length] = '\0';
    return string;
}

void getNamePasswd(char* name, char* passwd){       // 客户端的注册，会把用户名和密码加密后的盐值存放到数据库中
    printf("please enter username: ");
    scanf("%s", name);
    printf("please enter passwd: ");
    scanf("%s", passwd);
}

int main()
{
    srand((unsigned)time(NULL));
    char* salt[INIT_NUMBER];
    for(int i = 0; i< INIT_NUMBER; ++i){
        salt[i] = genRandomString(SALT_LENGTH);
    }

    MYSQL* mysql =  mysql_init(NULL);
    MYSQL* Mret = mysql_real_connect(mysql, "localhost", "root", "654321", "client"
                                     , 0, NULL, 0);     // 连接数据库
    if(Mret == NULL){
        fprintf(stderr, "%s\n", mysql_error(mysql));
    }

    int ret;
    // 连接上数据库后开始执行插入语句
    char* crypted[INIT_NUMBER];
    char sql[4096], name[128], passwd[4096];
    for(int i = 0; i < INIT_NUMBER; ++i){
        bzero(sql, sizeof(sql));
        bzero(name, sizeof(name));
        bzero(passwd, sizeof(passwd));
        getNamePasswd(name, passwd);            // 客户端注册行为

        crypted[i] = crypt(passwd, salt[i]);    // 加密密码
        sprintf(sql, "insert into info values( %d, '%s', '%s', '%s')", 
                i+1, name, salt[i], crypted[i]);    // 将用户名，盐值，以及加密后的密文存放到数据库中
        
        ret = mysql_query(mysql, sql);          // 执行插入语句
        if(ret != 0){
            fprintf(stderr, "%s\n", mysql_error(mysql));
        }

        bzero(sql, sizeof(sql));
        sprintf(sql, "insert into virtual_file values(%d, '/', 'd', -1, '/'," 
            "'%s', '0', 0);", i+1, name);       // 在数据库的虚拟文件系统下初始化三人的家目录

        ret = mysql_query(mysql, sql);
        if(ret != 0){
            fprintf(stderr, "%s\n", mysql_error(mysql));
        }
    }

    mysql_close(mysql);
    for(int i = 0; i < INIT_NUMBER; ++i){
        free(salt[i]);
    }
    return 0;
}

